package com.hope.class_;

import com.hope.Car;

import java.lang.reflect.Field;

/**
 * 演示Class类的常用方法
 *
 */
public class Class01 {
    public static void main(String[] args) throws Exception {
        String classAllPath="com.hope.Car";
        //1.  获取到Car类 对应到Class对象
        //<?> 表示不确定的Java类型
        Class cls = Class.forName(classAllPath);

        //2.  打印cls
        System.out.println(cls);//打印cls对象，是哪个类的Class对象class com.hope.Car
        System.out.println(cls.getClass());//输出cls运行类型class java.lang.Class

        //3.  得到包名
        System.out.println(cls.getPackage().getName());// 包名 com.hope

        //4.  得到全类名
        System.out.println(cls.getName());//com.hope.Car

        //5.  通过cls创建对象实例
        Object o = cls.getConstructor().newInstance();
        System.out.println(o);////Car{brand='宝马', price=500000, color='白色'}

        //6.  通过反射获得属性 brand
        //    如果想得到一个属性,其实就是得到Class类加载后
        //    在堆中的属性集合 Field[] fields 因为在反射中，把属性也当作对象
        Field brand = cls.getField("brand");
        System.out.println(brand.get(o));//宝马

        //7.  通过反射给属性赋值 通过反射获取的属性.set(cls的实例o,"value值")
        brand.set(o,"奔驰");
        System.out.println(brand.get(o));//奔驰

        //8. 获得所有的属性(字段)
        Field[] fields = cls.getFields();
        for(Field f:fields){
            System.out.println(f.getName());
        }



    }
}
